home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Hot Mix 17
/
Hot Mix 17.iso
/
HM17_SGI
/
research
/
lib
/
crvlength.pro
< prev
next >
Wrap
Text File
|
1997-07-08
|
3KB
|
86 lines
; $Id: crvlength.pro,v 1.4 1997/01/15 03:11:50 ali Exp $
;
; Copyright (c) 1996-1997, Research Systems, Inc. All rights reserved.
; Unauthorized reproduction prohibited.
;+
; NAME:
; CRVLENGTH
;
; PURPOSE:
; This function computes the length of a curve with a tabular
; representation, y(i) = F(x(i)).
;
; CATEGORY:
; Numerical Analysis
;
; CALLING SEQUENCE:
; Result = Crvlength(X, Y)
;
; INPUTS:
; X: An N-element vector (N >= 3) of type float or double. These
; values must be specified in ascending order. Duplicate x values
; will result in a warning message.
;
; Y: An N-element vector of type float or double.
;
; KEYWORD PARAMETERS:
; DOUBLE: If set to a non-zero value, computations are done in
; double precision arithmetic.
;
; RESTRICTIONS:
; Data that is highly oscillatory requires a sufficient number
; of samples for an accurate curve length computation.
;
; EXAMPLE:
; Define a 21-element vector of X-values.
; x = [-2.00, -1.50, -1.00, -0.50, 0.00, 0.50, 1.00, 1.50, 2.00, $
; 2.50, 3.00, 3.50, 4.00, 4.50, 5.00, 5.50, 6.00, 6.50, $
; 7.00, 7.50, 8.00]
; Define a 21-element vector of Y-values.
; y = [-2.99, -2.37, -1.64, -0.84, 0.00, 0.84, 1.64, 2.37, 2.99, $
; 3.48, 3.86, 4.14, 4.33, 4.49, 4.65, 4.85, 5.13, 5.51, $
; 6.02, 6.64, 7.37]
; Compute the length of the curve.
; result = CRVLENGTH(x, y)
; The result should be:
; 14.8115
;
; MODIFICATION HISTORY:
; Written by: GGS, RSI, March 1996
;-
FUNCTION CrvLength, X, Y, Double = Double
ON_ERROR, 2
TypeX = SIZE(X)
TypeY = SIZE(Y)
;Check Y data type.
if TypeY[TypeY[0]+1] ne 4 and TypeY[TypeY[0]+1] ne 5 then $
MESSAGE, "Y values must be float or double."
;Check length.
if TypeX[TypeX[0]+2] lt 3 then $
MESSAGE, "X and Y arrays must contain 3 or more elements."
if TypeX[TypeX[0]+2] ne TypeY[TypeY[0]+2] then $
MESSAGE, "X and Y arrays must have the same number of elements."
;Check duplicate values.
if TypeX[TypeX[0]+2] ne N_ELEMENTS(UNIQ(X)) then $
MESSAGE, "X array contains duplicate points."
;If the DOUBLE keyword is not set then the internal precision and
;result are identical to the type of input.
if N_ELEMENTS(Double) eq 0 then $
Double = (TypeX[TypeX[0]+1] eq 5 or TypeY[TypeY[0]+1] eq 5)
nX = TypeX[TypeX[0]+2]
Yprime = (SHIFT(Y,-1) - SHIFT(Y,1)) / (SHIFT(x,-1) - SHIFT(x,1) + 0.0)
Yprime[0] = (-3.0*Y[0] + 4.0*Y[1] - Y[2]) / (x[2] - x[0])
Yprime[nX-1] = (3.0*Y[nX-1] - 4.0*Y[nX-2] + Y[nX-3]) / (x[nX-1] - x[nX-3])
RETURN, INT_TABULATED(X, SQRT(1 + Yprime^2), Double = Double)
END